package db;

import java.util.Date;
import java.util.List;

import domain.*;
import web.PaginationSupport;

/**
 * 社团资源库接口
 */
public interface ClubRepository {

    /**
     * 获取社团的总数
     * @return 社团的数量
     */
    long count();

    /**
     * 创建一个新的社团
     * @param club 新社团的信息
     * @return 新创建的社团
     */
    Club save(Club club);

    /**
     * 根据ID查找社团
     * @param clubID 社团的ID
     * @return 对应ID的社团
     */
    Club findOne(int clubID);

    /**
     *  根据社团管理员查找社团
     * @param clubAdministrator 社团管理员
     * @return 对应社团管理员的社团
     */
    Club findOne(ClubAdministrator clubAdministrator);

    /**
     * 根据社团名查找社团
     * @param clubName 社团名
     * @return 对应社团名的社团
     */
    Club findByClubName(String clubName);

    /**
     * 分页查找社团
     * @param pageNo 页码
     * @param pageSize 每页的数量
     * @return 分页的社团列表
     */
    PaginationSupport<Club> findPage(int pageNo, int pageSize);

    /**
     * 审批社团
     * @param clubID 社团ID
     * @param approvalStatus 审批状态
     * @return 是否审批成功
     */
    boolean approveClub(int clubID, int approvalStatus);

    /**
     * 查看社团活动
     * @param clubID 社团ID
     * @return 社团的活动列表
     */
    List<Activity> viewClubActivities(int clubID);

    /**
     * 审批社团活动
     * @param activityId 活动ID
     * @param approvalStatus 审批状态
     * @return 是否审批成功
     */
    boolean approveClubActivity(int activityId, int approvalStatus);

    /**
     * 删除社团
     * @param clubID 社团ID
     * @return 是否删除成功
     */
    boolean deleteClub(int clubID);

    /**
     * 获取所有社团
     * @return 所有社团的列表
     */
    List<Club> findAll();

    /**
     * 列出成员列表
     * @param clubID 社团ID
     * @return 社团的成员列表
     */
    List<User> listMembers(int clubID);

    /**
     * 入团审批
     * @param userId 用户ID
     * @param clubID 社团ID
     * @param approvalStatus 审批状态
     * @return 是否审批成功
     */
    boolean approveMembership(int userId, int clubID, int approvalStatus);
    
    /**
     * 根据用户查找社团
     * @param userId 用户ID
     * @return 用户所在的社团列表
     */
    List<Club> findByUserId(int userId);

    /**
     * 根据用户查找用户所以申请记录
     *
     * @param userId 用户ID
     * @return 用户的申请记录列表
     */
    List<MembershipApplication> findApplicationsByUserId(int userId);

    /**
     * 根据用户退出社团
     * @param userId 用户ID
     * @param clubId 社团ID
     * @return 是否退出成功
     */
    boolean quitClub(int userId, int clubId);


    /**
     * 更新社团信息
     *
     * @param clubID      社团ID
     * @param clubName    社团名
     * @param college     学院
     * @param description 社团描述
     * @param createTime  创建时间
     * @return 是否更新成功
     */
    boolean updateClub(int clubID,String clubName,String college,String description,Date createTime);

    /**
     * 查看社团管理员的社团信息
     * @param clubAdminID 社团管理员ID
     * @return 社团管理员的社团信息
     */
    Club viewClubInfo(int clubAdminID);

    /**
     * 更新社团管理员的社团信息
     * @param clubAdminID 社团管理员ID
     * @param club 新的社团信息
     * @return 是否更新成功
     */
    boolean updateClubInfo(int clubAdminID, Club club);
}
